//
// Created by Administrator on 2023/11/17.
//

#include "iostream"

using namespace std;

const int N = 1e6 + 10;
int a[N], q[N];
int n, k;
int hh, tt = -1;

int main() {
    cin >> n >> k;
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }

    //i表示下标 ，是窗口依次经历的右端点【最小值】
    for (int i = 0; i < n; ++i) {
        // 队头出队（队头元素滑出窗口）
        if (hh <= tt && q[hh] < i - k + 1) hh++;

        // 队尾出队 （队列不空且新元素更优）
        while (hh <= tt && a[q[tt]] >= a[i]) tt--;
        // 队尾入队（存储下标，方便判断队头出队）
        q[++tt] = i;
        // 使用最值
        if (i >= k - 1) cout << a[q[hh]] << ' ';
    }
    cout << endl;
    hh = 0, tt = -1;
    //i表示下标 ，是窗口依次经历的右端点【最大值】
    for (int i = 0; i < n; ++i) {
        // 如果对头元素对应的下标已经不在窗口内，且队列非空，直接出队
        if (hh <= tt && q[hh] < i - k + 1) hh++;

        // 队尾出队 （队列不空且新元素更优）
        while (hh <= tt && a[q[tt]] <= a[i]) tt--;
        // 队尾入队（存储下标，方便判断队头出队）
        q[++tt] = i;
        //由于i是从0开始，if判断保证窗口内有k个元素
        if (i >= k - 1) cout << a[q[hh]] << ' ';
    }
}